#include "Lsimple.h"
#include <string.h>

/* LS_Crear
@ PRE: LS no creada
@ POS: LS creada
*/
void LS_Crear (TListaSimple *pLS, int tamanioDato){

	pLS->Prim=NULL;
	pLS->Cte=NULL;
	pLS->TamanioDato=tamanioDato;
	}
/* LS_Vacia
@ PRE: LS creada
@ POS: Si la lista esta vacia devuelve TRUE, sino FALSE
*/
int LS_Vacia (TListaSimple LS){

	if (LS.Prim==NULL){
		return TRUE;
		}
	else{
		return FALSE;
		}
}


/* LS_Vaciar
@ PRE: LS creada
@ POS: Se eliminaron todos los elementos de LS
*/
void LS_Vaciar (TListaSimple *pLS){

	TNodoSimple *pNodo, *Sig;
    for (pNodo = pLS->Prim; (pNodo); pNodo=Sig)
    {
        Sig = pNodo->Sig;
        free (pNodo->Elem);
        free (pNodo);
        }
    pLS->Prim = pLS->Cte = NULL;


	}



/*
@ PRE: LS creada y no vacia
@ POS: Si M = LS_PRIMERO, el nuevo cte es el primero de la lista
       si M = LS_SIGUIENTE,
       Si pudo realizar el movimiento devuelve TRUE, sino FALSE
*/
int LS_MoverCte (TListaSimple *pLS, TMovimS M ){

	switch (M){

	case LS_PRIMERO:
			pLS->Cte=pLS->Prim;
			break;

	case LS_SIGUIENTE:
			if (pLS->Cte->Sig==NULL)
					return FALSE;
			else
				pLS->Cte=pLS->Cte->Sig;
				break;
	}
return TRUE;

}

/*
@ PRE: LD creada
@ POS: Se agrego E a la lista y es el nuevo corriente,
       si M = LD_PRIMERO o la lista esta vacia, se inserto como primero de la lista
       si M = LD_SIGUIENTE, se inserto despues del elemento coriente
       Si pudo insertar el elemento devuelve TRUE, sino FALSE
*/
int LS_Insertar (TListaSimple *pLS, TMovimS M, void* pE){

	TNodoSimple* pNodo= (TNodoSimple*) malloc(sizeof(TNodoSimple));

	if (!pNodo) return 0;
	if(pNodo){

		pNodo->Elem= malloc( pLS->TamanioDato);
		memcpy(pNodo->Elem, pE, pLS->TamanioDato);
		pNodo->Sig = NULL;

		if ( (pLS->Prim== NULL) || (M == LS_PRIMERO) && (pLS->Prim == pLS->Cte)){
			pNodo->Sig = pLS->Prim;
			pLS->Prim= pNodo;
			 }

		else{
			if (M == LS_SIGUIENTE){
				pNodo->Sig= pLS->Cte->Sig;
				pLS->Cte->Sig = pNodo;
				}
		}

		pLS->Cte = pNodo;
		return TRUE;
	}

	else
		return FALSE;
}


/*
@ PRE: LS creada y no vacia
@ POS: Se elimino el elemento corriente. El nuevo corriente es el siguiente de eliminado, o el anterior si este era el ultimo
*/
void LS_BorrarCte (TListaSimple *pLs){
   TNodoSimple *PNodo=pLs->Cte;
   if (pLs->Cte==pLs->Prim)
   {
      pLs->Prim = pLs->Cte->Sig;
      pLs->Cte = pLs->Prim;
   }
   else
   {
      TNodoSimple *PAux=pLs->Prim;
      while (PAux->Sig!=pLs->Cte)
         PAux = PAux->Sig;
      PAux->Sig=pLs->Cte->Sig;
      if (PAux->Sig) //Si no es el último
         pLs->Cte = PAux->Sig;
      else
         pLs->Cte = PAux; //Si es el último queda en el anterior al
                                 //borrado
   }
   free(PNodo->Elem);
   free(PNodo);
}


/*
@ PRE: LS creada y no vacia
@ POS:
*/
void LS_ObtenerCte (TListaSimple LS, void* pE){
	memcpy (pE, LS.Cte->Elem, LS.TamanioDato);
	}

/*
@ PRE:
@ POS:
*/
void LS_ModificarCte (TListaSimple *pLS, void* pE){
	memcpy (pLS->Cte->Elem, pE, pLS->TamanioDato);
	}
